package com.course02.order_backend.controller.llh;

import com.course02.order_backend.utils.llh.SysLogUtil;
import jakarta.servlet.http.HttpServletRequest;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestController {
    private static final Logger log = LoggerFactory.getLogger(TestController.class);
    @Autowired
    private SysLogUtil sysLogUtil; // 注入自定义日志工具类
    @GetMapping("/test/log")
    public String testLog(HttpServletRequest request) {
        // 1. 定义日志参数
        String logType = "1"; // 日志类型：1=接口调用
        String businessId = "1001"; // 业务ID：模拟订单ID
        String module = "【订单业务】"; // 模块名（匹配之前的过滤规则）
        String content = "用户admin查询订单1001"; // 日志内容
        String operatorId = "1"; // 操作人ID（tb_user 表中的 admin 账号ID）
        String operatorName = "admin"; // 操作人姓名
        String operateIp = getClientIp(request); // 操作IP
        String logLevel = "INFO"; // 日志级别

        MDC.put("module",module);
        MDC.put("businessId",businessId);
        MDC.put("operateIp",operateIp);

        // 2. 打印控制台/文件日志（通过 logback 配置）
        log.info(content);

        // 3. 手动写入数据库日志（通过自定义工具类）
        sysLogUtil.saveLog(logType, businessId, module, content,
                operatorId, operatorName, operateIp, logLevel);

        return "日志测试完成（已写入控制台、文件和数据库）";
    }
    //从http请求获取客户端真实ip
    private String getClientIp(HttpServletRequest request){
        //优先从 X-Forwarded-For 头获取 IP（最通用的代理传递真实 IP 的字段），保证从浏览器和获取真实的ip地址而不是nginx代理地址
        String ip=request.getHeader("X-Forwarded-For");
        //如果 X-Forwarded-For 为空/未知，尝试从 Proxy-Client-IP 头获取（部分代理用这个字段）
        if(ip==null||ip.isEmpty()||"unknown".equalsIgnoreCase(ip)){
            ip=request.getHeader("Proxy-Client-IP");
        }
        // 如果 Proxy-Client-IP 也为空/未知，尝试从 WL-Proxy-Client-IP 头获取（WebLogic 服务器专用）
        if(ip==null||ip.isEmpty()||"unknown".equalsIgnoreCase(ip)){
            ip=request.getHeader("WL-Proxy-Client-IP");
        }
        //以上都获取不到时，才用 getRemoteAddr()（兜底方案，可能是代理 IP 或本地 IP）
        if(ip==null||ip.isEmpty()||"unknown".equalsIgnoreCase(ip)){
            ip=request.getRemoteAddr();
        }
        return ip!=null?ip.split(",")[0].trim():"0.0.0.0";
    }
}